堆排序
堆排序(Heapsort)是指利用堆積樹(shù)(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法,它是選擇排序的一種。它是通過(guò)堆來(lái)進(jìn)行選擇數(shù)據(jù)。需要注意的是排升序要建大堆,排降序建小堆。
void AdjustDown(int* a, int n, int parent)
{
? ? int child = parent * 2 + 1;
? ? while (child < n)
? ? {
? ? ? ? // 找出小的那個(gè)孩子
? ? ? ? if (child + 1 < n && a[child + 1] > a[child])
? ? ? ? {
? ? ? ? ? ? ++child;
? ? ? ? }
? ? ? ? if (a[child] > a[parent])
? ? ? ? {
? ? ? ? ? ? Swap(&a[child], &a[parent]);
? ? ? ? ? ? // 繼續(xù)往下調(diào)整
? ? ? ? ? ? parent = child;
? ? ? ? ? ? child = parent * 2 + 1;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
?
void HeapSort(int* a, int n)
{
? ? // 向下調(diào)整建堆
? ? // O(N)
? ? for (int i = (n - 1 - 1) / 2; i >= 0; i--)
? ? {
? ? ? ? AdjustDown(a, n, i);
? ? }
? ? // O(N*logN)
? ? int end = n - 1;
? ? while (end > 0)
? ? {
? ? ? ? Swap(&a[0], &a[end]);
? ? ? ? AdjustDown(a, end, 0);
? ? ? ? --end;
? ? }
}
堆排序的特性總結(jié):
- 堆排序使用堆來(lái)選數(shù),效率就高了很多。
- 時(shí)間復(fù)雜度:O(N*logN)
- 空間復(fù)雜度:O(1)
- 穩(wěn)定性:不穩(wěn)定